package com.li.utlis;

import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
import com.alibaba.excel.event.SyncReadListener;
import com.alibaba.excel.write.metadata.WriteSheet;

import java.io.File;
import java.util.*;

public class EasyExcelUtil {

    /**
     * 读取excel表格
     * @param file 目标文件
     * @param head 文件读出后所对应的类
     * @return 返回读出数据的集合
     */
    public static List readExcel(File file,Class head) {
        //final List list = new ArrayList();
        List list = new ArrayList();
        //使用EasyExcel读取.xlsx文件
        EasyExcel.read(file, head, new SyncReadListener() {
            @Override
            public void invoke(Object object, AnalysisContext context) {
                list.add(object);
            }
        }).doReadAll();
        return list;
    }

    /**
     * 读取excel表格
     * @param file 目标文件
     * @param head 文件读出后所对应的类
     * @return 返回一个Map，其中有数据的集合list，还有一个表格中的标题map
     */
    public static Map<String, Object> readExcelTitle(File file, Class head){
        //使用EasyExcel读取.xlsx文件
        List list=new ArrayList();
        Map<String,Object> map=new HashMap<>();
        EasyExcel.read(file,head, new AnalysisEventListener<Object>() {
                    //重写子类方法
                    @Override
                    public void invoke(Object object, AnalysisContext analysisContext) {
                        list.add(object);
                    }
                    //重写子类方法
                    @Override
                    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
                    }

                    @Override
                    public void invokeHeadMap(Map headMap, AnalysisContext context) {
                        //headMap，中存放着表格标题
                        map.put("title",headMap);//将标题存放到定义的map中
                        System.out.println(headMap);
                    }
                }
        ).doReadAll();
        map.put("data",list);//将数据存放到定义的map中
        return map;
    }

    /**
     * 将数据写入到表格中，如果不存在则会创建一个表格
     * @param file 目标文件
     * @param list 要写入的数据
     * @param head 数据对应的实体类
     */
    public static void writeExcel(File file, List list, Class head) {
        EasyExcel
                .write(file, head)
                .sheet()
                .doWrite(list);
    }

    /**
     * 将数据写入到表格中，如果不存在则会创建一个表格
     * @param file 目标文件
     * @param list 要写入的数据
     * @param head 数据对应的实体类
     * @param sheetName sheet页的名字
     */
    public static void writeExcel(File file, List list, Class head,String sheetName) {
        ExcelWriter excelWriter = null;
        try {
            excelWriter = EasyExcel.write(file, head).build();
            WriteSheet writeSheet = EasyExcel.writerSheet(sheetName).build();
            excelWriter.write(list, writeSheet);
        } finally {
            // 千万别忘记finish 会帮忙关闭流
            if (excelWriter != null) {
                excelWriter.finish();
            }
        }
    }

    /**
     * 将模板数据写入到表格中
     * @param file 对应的表格文件
     * @param fileTemplate 模板文件
     * @param head 对应的实体类
     */
    public static void write_template_multi(File file,File fileTemplate,Class head) {
        List list = new ArrayList();
        EasyExcel
                .write(file, head)
                .withTemplate(fileTemplate)
                .sheet()
                .doFill(list);
    }

}
